package collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * JDK5推出时，推出了一个特性:增强型for循环。
 * 该特性使得我们可以用相同的语法遍历数组和集合。
 * 
 * 语法:
 * for(接收元素的变量定义 : 集合或数组){
 * 	循环体
 * }
 * 
 * JDK5推出时还推出了一个特性:泛型
 * 泛型又称为参数化类型，可以在使用一个类时指定该类中某个属性或者方法的参数，返回值
 * 的类型。使得使用时更灵活。
 * 泛型在集合中广泛应用，用于指定集合中的元素类型。支持泛型的类在使用时若不指定泛型
 * 的实际类型时，默认为Object
 * 
 * 
 * @author 范传奇
 *
 */
public class NewForDemo {
	public static void main(String[] args) {
		String[] array = {"one","two","three","four","five"};
		for(int i=0;i<array.length;i++) {
			String str = array[i];
			System.out.println(str);
		}
		/*
		 * 新循环语法是编译器认可的而非虚拟机，我们使用新循环遍历数组时会被
		 * 编译器改为使用普通for循环遍历。
		 */
		for(String str : array) {
			System.out.println(str);
		}
		
		/*
		 * Collection<E>，集合定义时有一个泛型类型E，那么使用时可以指定E表示的
		 * 实际类型是什么，下面的例子中实际类型指定的为Integer
		 */
		Collection<Integer> c = new ArrayList<Integer>();
		c.add(1);//自动装箱
		c.add(2);
		c.add(3);
		c.add(4);
		c.add(5);
//		c.add("one");//编译不通过，编译器会检查传入的参数是否为Integer
		System.out.println(c);
		//迭代器使用时同样要指定泛型，类型与遍历的集合指定的泛型一致即可。
		Iterator<Integer> it = c.iterator();
		while(it.hasNext()) {
			Integer i = it.next();//获取元素时无需再造型。
			System.out.println(i);
		}
		/*
		 * 新循环遍历集合会被编译器改为迭代器遍历，因此使用新循环遍历集合的过程
		 * 中不能通过集合的方法增删元素。
		 */
		for(Integer i : c) {//集合指定泛型后，这里可以直接用泛型指定类型接收
			System.out.println(i);
		}
		/*
		 * 使用新循环(迭代器)遍历集合不是并发安全的，也不会和集合的增删元素做
		 * 互斥，因此在多线程使用下，要自行维护多个线程对该集合的操作，避免一个
		 * 线程遍历的过程中其他线程进行增删元素操作，否则遍历这里会抛出异常。
		 */
	}
}












